package prirprojekt;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.midi.SysexMessage;
import javax.swing.*;

public class Interfejs extends JFrame implements ActionListener {

    private boolean readyFlag = false;
    private int ileZadan = 10;
    private int ilePszczol = 5;
    private int ileCPU = 3;
    private int ileIteracji = 100;
    private PermutacjaZadan pz;
    private Roj r;
    private JButton _btnLosoweDane;
    private JButton _btnIteruj;
    private JButton _btnWykres;
    private JButton _btnWczytaj;
    private JButton _btnLadujPlik;
    private JLabel _lblProcesory;
    private JComboBox<Integer> _cbProcesory;
    private JLabel _lblZadania;
    private JComboBox<Integer> _cbZadania;
    private JLabel _lblIteracje;
    private JComboBox<Integer> _cbIteracje;
    private JLabel _lblPszczolki;
    private JComboBox<Integer> _cbPszczolki;
    private Tabela _tblDaneWe;
    private JScrollPane _scpDaneWe;
    private Tabela _tblDaneWy;
    private JScrollPane _scpDaneWy;
    private JLabel _lblCzas;

    public Interfejs(PermutacjaZadan pz, Roj r) {
        _btnIteruj = new JButton("Oblicz");
        _btnLosoweDane = new JButton("Losuj dane");
        _btnIteruj.setToolTipText("Aby dokonać obliczeń wylosuj lub wczytaj dane");
        _btnWykres = new JButton("Wykres");
        _btnWczytaj = new JButton("Wczytaj dane z tabeli");
        _btnLadujPlik = new JButton("Wczytaj z pliku");
        _lblProcesory = new JLabel("Ilość procesorów");
        Integer[] lProcesorow = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        _cbProcesory = new JComboBox<>(lProcesorow);
        _lblZadania = new JLabel("Ilość zadań");
        Integer[] lZadania = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
        _cbZadania = new JComboBox<>(lZadania);
        _lblIteracje = new JLabel("Ilość iteracji");
        Integer[] lIteracji = new Integer[398];
        //dodaj 2 do wyliczonego
        for (int i = 0; i < 398; i++) {
            lIteracji[i] = i + 2;
        }
        _cbIteracje = new JComboBox<>(lIteracji);
        _lblPszczolki = new JLabel("Ilość robotnic");
        Integer[] lPszczol = {2, 3, 4, 5, 6, 7, 8, 9, 10};
        _cbPszczolki = new JComboBox<>(lPszczol);

        //czas na 3ch CPU dla z0 do z9
        _tblDaneWe = new Tabela(3, 10);
        _tblDaneWe.setLabels("z");

        _scpDaneWe = new JScrollPane(_tblDaneWe);
        _tblDaneWe.setFillsViewportHeight(true);

        _tblDaneWy = new Tabela(0, 0);
        _scpDaneWy = new JScrollPane(_tblDaneWy);
        _lblCzas = new JLabel("Czas obliczeń:");
        _tblDaneWe.setFillsViewportHeight(true);
        _scpDaneWy.setBounds(10, 340, 760, 200);
        _btnWczytaj.setBounds(10, 300, 180, 40);
        _btnLadujPlik.setBounds(190, 300, 150, 40);
        _lblCzas.setBounds(200, 300, 200, 40);

        _btnLosoweDane.setBounds(10, 10, 100, 40);
        _btnIteruj.setBounds(110, 10, 100, 40);
        _btnWykres.setBounds(210, 10, 100, 40);

        _lblProcesory.setBounds(10, 60, 100, 20);
        _cbProcesory.setBounds(110, 60, 40, 20);

        _lblZadania.setBounds(160, 60, 80, 20);
        _cbZadania.setBounds(240, 60, 40, 20);

        _lblIteracje.setBounds(290, 60, 80, 20);
        _cbIteracje.setBounds(370, 60, 50, 20);

        _lblPszczolki.setBounds(430, 60, 80, 20);
        _cbPszczolki.setBounds(520, 60, 50, 20);

        _scpDaneWe.setBounds(10, 100, 760, 200);

        _cbProcesory.setSelectedIndex(2);
        _cbZadania.setSelectedIndex(8);
        _cbIteracje.setSelectedIndex(98);
        _cbPszczolki.setSelectedIndex(3);

        _btnWykres.setEnabled(false);
        _btnIteruj.setEnabled(false);

        add(_btnIteruj);
        add(_btnLosoweDane);
        add(_btnWykres);
        add(_btnWczytaj);
//        add(_btnLadujPlik);
        add(_lblCzas);

        add(_lblProcesory);
        add(_cbProcesory);
        add(_lblZadania);
        add(_cbZadania);
        add(_lblIteracje);
        add(_cbIteracje);
        add(_lblPszczolki);
        add(_cbPszczolki);

        add(_scpDaneWe);
        add(_scpDaneWy);

        _btnIteruj.addActionListener(this);
        _btnLosoweDane.addActionListener(this);
        _btnWykres.addActionListener(this);
        _cbProcesory.addActionListener(this);
        _cbZadania.addActionListener(this);
        _cbPszczolki.addActionListener(this);
        _cbIteracje.addActionListener(this);
        _btnWczytaj.addActionListener(this);
//        _btnLadujPlik.addActionListener(this);

        int windowHeight = 600;
        int windowWidth = 800;

        this.setLayout(null);
        this.setBounds(100, 20, windowWidth, windowHeight);
        this.setTitle("PRIR - metaherystyka równoległa - szeregowanie zadań FlowShop algorytmem ABC");
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource().equals(_btnLosoweDane)) {
            //losowanie danych
            readyFlag = true;
            _btnIteruj.setEnabled(true);
            ileCPU = _cbProcesory.getSelectedIndex() + 1;
            ileZadan = _cbZadania.getSelectedIndex() + 2;
            ileIteracji = _cbIteracje.getSelectedIndex() + 2;
            ilePszczol = _cbPszczolki.getSelectedIndex() + 2;

            this.pz = new PermutacjaZadan(ileZadan, ileCPU);

            _tblDaneWe.setTasks(ileZadan, ileCPU, pz);

        } else if (e.getSource().equals(_btnIteruj)) {
            //uruchomienie obliczeń rozproszonych
            if (readyFlag) {
                _btnWykres.setEnabled(true);
                Date czas = new Date();
                long startT = 0, endT = 0;

                try {
                    startT = czas.getTime();
                    this.r = new Roj(ileCPU, ileIteracji, ilePszczol, pz);
                    r.iteruj();
                    czas = new Date();
                    endT = czas.getTime();
                } catch (InterruptedException ex) {
                    Logger.getLogger(Interfejs.class.getName()).log(Level.SEVERE, null, ex);
                } finally {
//                    System.out.println("Czas obliczeń: " + (endT - startT));
                    _lblCzas.setText("Czas obliczeń: " + (endT - startT) + "ms");
                }

                
                _tblDaneWy.setColumns(ileZadan);
                _tblDaneWy.setRows(ilePszczol);
                _tblDaneWy.populateAnswers(r);
                
            }
        } else if (e.getSource().equals(_cbProcesory)) {
            ileCPU = _cbProcesory.getSelectedIndex() + 1;
            _tblDaneWe.setRows(ileCPU);
            readyFlag = false;
        } else if (e.getSource().equals(_cbZadania)) {
            ileZadan = _cbZadania.getSelectedIndex() + 2;
            _tblDaneWe.setColumns(ileZadan);
            _tblDaneWe.setLabels("z");
            readyFlag = false;
        } else if (e.getSource().equals(_cbPszczolki)) {
            ilePszczol = _cbPszczolki.getSelectedIndex() + 2;
            readyFlag = false;
        } else if (e.getSource().equals(_cbIteracje)) {
            ileIteracji = _cbIteracje.getSelectedIndex() + 2;
            readyFlag = false;
        } else if (e.getSource().equals(_btnWczytaj)) {
            _btnIteruj.setEnabled(true);

            pz = new PermutacjaZadan(_tblDaneWe.loadTasks(ileZadan, ileCPU));
            r = new Roj(ileCPU, ileIteracji, ilePszczol, pz);

            //wyświetlenie w danych wejściowych po przefiltrowaniu
            _tblDaneWe.setTasks(ileZadan, ileCPU, pz);
            readyFlag = true;
        } else if (e.getSource().equals(_btnWykres)) {
            Wykres w = new Wykres(r);
//        } else if (e.getSource().equals(_btnLadujPlik)) {
//            final JFileChooser fc = new JFileChooser();
//            int returnVal = fc.showOpenDialog(this);
//
//            if (returnVal == JFileChooser.APPROVE_OPTION) {
//                File file = fc.getSelectedFile();
//                String ext = null;
//                String s = file.getName();
//                int i = s.lastIndexOf('.');
//                if (i > 0 && i < s.length() - 1) {
//                    ext = s.substring(i + 1).toLowerCase();
//                }
//                if (ext.equals("txt")) {
//                    try {
//                        FileInputStream fs = new FileInputStream(file);
//                        DataInputStream in = new DataInputStream(fs);
//
//                        while (in.available() != 0) {
//                            System.out.println(in.readLine());
//                        }
//                        in.close();
//                    } catch (Exception ex) {
//                        Logger.getLogger(Interfejs.class.getName()).log(Level.SEVERE, null, ex);
//                    }
//                }
//            }
        }
    }
}